"""
装饰器：如果一个函数的定义已经完成。需要在不修改该函数的情况下，进行功能的扩展。
    使用装饰器


func1(func)

函数式编程：函数的功能强大：函数可以看成变量，作为参数，作为返回值。。高阶函数，闭包。。。

耦合性： a 发生改变后, b 随之发生改变, 我们就说, a b存在耦合关系
    低耦合：降低程序的耦合性。

设计程序：开放，封闭
    封闭：对于已经实现好了的功能进行封闭。
    开放：对扩展开放

思路步骤：
step1：定义一个原始函数：hello()

step2：定义一个装饰器函数：应用闭包
def strong(fun):
    def new_xxx():
        # 新增功能。。。
        fun()

    return new_xxx

分析原理：hello = strong(hello)

使用：在原始函数上添加：@装饰器函数名即可

"""


def hello():
    print('hello')


def strong(func):
    def inner():
        print('你好!')
        func()
        print('日文的 你好')

    return inner


# hello()

print(type(hello()))
print(type(hello))


# func()
# strong(hello)
# <class 'function'>
# print(type(strong(hello)))

# strong(hello)()

@strong
def hello1():
    print('hhhhhh')


hello1()

print('sssssssssssssssssssssssssssss')
strong(hello)()


def strong_with_p(func):
    def inner(pa):
        print('你好!')
        func(pa)
        print('日文的 你好')
        return '结果'

    return inner


@strong_with_p
def yuan(param):
    print(param)


res1 = strong_with_p(yuan)('HHGGGII')
res = yuan('HHHHLLLLL')

print(res1)
print(res)


def func():
    return 'Andy'


def outer1(fun):
    def inner():
        x = fun()
        print(x.lower())
        return x.lower()

    return inner


# outer1(func)()


@outer1
def funcc():
    return 'AndyAA'


funcc()

"""


# print(outer1(func)())


def outer2(fun):
    def inner(xx):
        x = fun(xx)
        print(x.lower())
        return x.lower()

    return inner


@outer2
def func_p(x):
    return x


print(outer2(func_p)('HlKL'))

func_p('HH')

"""
